package cn.tedu.csmall.product.service.impl;

import cn.tedu.csmall.product.ex.ServiceException;
import cn.tedu.csmall.product.mapper.AlbumMapper;
import cn.tedu.csmall.product.mapper.PictureMapper;
import cn.tedu.csmall.product.mapper.SpuMapper;
import cn.tedu.csmall.product.pojo.dto.AlbumAddNewDTO;
import cn.tedu.csmall.product.pojo.dto.AlbumUpdateDTO;
import cn.tedu.csmall.product.pojo.entity.Album;
import cn.tedu.csmall.product.pojo.entity.Brand;
import cn.tedu.csmall.product.pojo.entity.Picture;
import cn.tedu.csmall.product.pojo.vo.AlbumListItemVO;
import cn.tedu.csmall.product.pojo.vo.AlbumStandardVO;
import cn.tedu.csmall.product.pojo.vo.BrandStandardVO;
import cn.tedu.csmall.product.service.IAlbumService;
import cn.tedu.csmall.product.web.ServiceCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 处理相册数据的业务实现类
 */
@Service
@Slf4j
public class AlbumServiceImpl implements IAlbumService {
    @Autowired
    private AlbumMapper albumMapper;
    @Autowired
    private PictureMapper pictureMapper;
    @Autowired
    private SpuMapper spuMapper;

    public AlbumServiceImpl() {
        log.debug("创建业务对象: AlbumServiceImpl");
    }

    @Override
    public void addNew(AlbumAddNewDTO albumAddNewDTO) {
        log.debug("开始处理[添加相册]业务,参数:{}",albumAddNewDTO);
        // 从参数对象中获取相册名称
        String name = albumAddNewDTO.getName();
        // 检查相册名称是否已经被占用（相册表中是否已经存在此名称的数据）
        int i = albumMapper.countByName(name);
        log.debug("开始判断相册是否存在");
        if (i > 0) {
            // 是：相册名称已经被占用，添加相册失败，抛出异常
            String message = "添加相册失败,相册名称已经被占用";
            log.debug(message);
//            throw new ServiceException(ServiceCode.ERROR_CONFLICT,message);
        }
        // 否：相册名称没有被占用，则向相册表中插入数据
        log.debug("相册名称未被占用，将向相册表中插入数据");
        Album album = new Album();
        BeanUtils.copyProperties(albumAddNewDTO,album);
        log.debug("即将向表中插入数据:{}",album);
        int rows = albumMapper.insert(album);
        if (rows != 1) {
            String message = "添加失败, 服务器忙, 请稍后再试";
            throw new ServiceException(ServiceCode.ERR_INSERT, message);
        }
        log.debug("插入数据完成");
    }

    @Override
    public void delete(Long id) {
        log.debug("开始处理[根据id删除相册]的业务,参数{}",id);
        AlbumStandardVO queryResult = albumMapper.getStandardById(id);
        if (queryResult == null) {
            String message = "删除失败,尝试访问的数据不存在";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }

        log.debug("判断相册是否有关联的图片");
        int i = pictureMapper.countByAlbumId(id);
        if (i>0) {
            String message = "此相册有关联的图片,不能删除";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_CONFLICT, message);
        }

        log.debug("判断相册是否有关联的spu数据");
        i = spuMapper.countByAlbumId(id);
        if (i>0) {
            String message = "此相册有关联的spu数据,不能删除";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_CONFLICT, message);
        }
        log.debug("即将执行删除,参数{}",id);
        albumMapper.deleteById(id);
    }

    @Override
    public void updateById(AlbumUpdateDTO albumUpdateDTO) {
        log.debug("开始处理[根据id修改相册业务], 参数:{}",albumUpdateDTO);
        //查询相册是否存在
        AlbumStandardVO standardById = albumMapper.getStandardById(albumUpdateDTO.getId());
        if (standardById == null) {
            //若为空,表示相册不存在,抛出异常不能删除
            String message = "修改失败, 试图访问的数据不存在";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }
        //若不为空,表示相册存在,可以进行下一步判断
        log.debug("相册存在,可以行下一步判断");
        //是: 存在, 判断修改的名字是否有重复
        int i = albumMapper.countByName(albumUpdateDTO.getName());
        if (i > 0) {
            //是: 有重复, 抛出异常, 修改失败
            String message = "相册名称已被占用, 修改失败";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_CONFLICT, message);
        }
        //否: 名称未被占用, 可以修改
        Album album = new Album();
        BeanUtils.copyProperties(albumUpdateDTO, album);
        log.debug("名称未被占用, 可以修改, 参数:{}",album);
        i = albumMapper.update(album);
        if (i != 1){
            String message = "修改失败, 服务器忙, 请稍后再试";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_UPDATE, message);
        }
    }

    @Override
    public List<AlbumListItemVO> list() {
        log.debug("开始处理[查询相册列表]业务, 无参数");
        return albumMapper.list();
    }

    @Override
    public AlbumStandardVO getStandardById(Long id) {
        log.debug("开始处理查询相册详情业务,参数:{}",id);
        AlbumStandardVO vo = albumMapper.getStandardById(id);
        if (vo == null) {
            String message = "相册数据不存在,查询失败";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }
        return vo;
    }
}